package setting

import (
	"time"
)

type HttpServerSetting struct {
	Port             string
	RunMode          string
	AllowCrossDomain bool
	ReadTimeout      time.Duration
	WriteTimeout     time.Duration
}

type MysqlMultiSetting struct {
	ConnNames []interface{}
}

type MysqlConnSetting struct {
	Path            string
	User            string
	Pass            string
	DataBase        string
	Charset         string
	SlowThreshold   int
	MaxIdleConns    int
	MaxOpenConns    int
	ConnMaxLifetime int
}

// 日志配置
type LogsSetting struct {
	Level        string
	Director     string
	LinkName     string
	TextFormat   string
	Prefix       string
	EncodeLevel  string
	MaxSize      int
	MaxBackups   int
	MaxAge       int
	Compress     bool
	ShowLine     bool
	LogInConsole bool
}

type JWTSetting struct {
	Secret        string
	OnlineUsers   int
	CreatedExpire int64
	RefreshExpire int64
}

// 雪花算法参数
type SnowFlakeSetting struct {
	MachineId int
}

type RedisSetting struct {
	Path               string
	Auth               string
	MaxIdle            int
	MaxActive          int
	IdleTimeout        int
	IndexDb            int
	ConnFailRetryTimes int //从连接池获取连接失败，最大重试次数
	ReConnectInterval  int
}

// hashids相关配置
type HashIdsSetting struct {
	Length int
	Salt   string
}

// Rabbitmq相关 helloworld模式
type RabbitHelloSetting struct {
	Addr                        string // 消息服务器地址、账号、密码
	QueueName                   string
	Durable                     bool // 消息是否持久化
	ConsumerChanNumber          int  // 消费者通道数量（允许一个消费者使用几个连接通道消费、处理消息）
	OffLineReconnectIntervalSec int  // 消费者掉线后,重连间隔的秒数
	RetryCount                  int
}

// rabbitmq pubsub模式
type RabbitPubsubSetting struct {
	Addr                        string // 消息服务器地址、账号、密码
	ExchangeType                string
	ExchangeName                string
	Durable                     bool   // 消息是否持久化
	QueueName                   string // 队列名称，为空 表示所有订阅的消费者（consumer）都可以接受到同样的消息，如果设置名称，会导致只有最后一个启动的消费者能接受到消息。
	ConsumerChanNumber          int    // 消费者通道数量（发布、订阅模式消费者使用一个通道，避免多个通道重复收到数据）
	OffLineReconnectIntervalSec int    // 消费者掉线后,重连间隔的秒数
	RetryCount                  int
}

type RabbitWorkQueueSetting struct {
	Addr                        string // 消息服务器地址、账号、密码
	QueueName                   string
	Durable                     bool // 消息是否持久化
	ConsumerChanNumber          int  // 消费者通道数量（允许一个消费者使用几个连接通道消费、处理消息）
	OffLineReconnectIntervalSec int  // 消费者掉线后,重连间隔的秒数
	RetryCount                  int
}

type RabbitRoutSeting struct {
	Addr                        string // 消息服务器地址、账号、密码
	ExchangeType                string
	ExchangeName                string
	Durable                     bool // 消息是否持久化
	QueueName                   string
	OffLineReconnectIntervalSec int // 消费者掉线后,重连间隔的秒数
	RetryCount                  int // 消费者掉线后,尝试重连最大次数
}

type RabbitTopicSetting struct {
	Addr                        string // 消息服务器地址、账号、密码
	ExchangeType                string
	ExchangeName                string
	Durable                     bool // 消息是否持久化
	QueueName                   string
	OffLineReconnectIntervalSec int // 消费者掉线后,重连间隔的秒数
	RetryCount                  int // 消费者掉线后,尝试重连最大次数
}

var sections = make(map[string]interface{})

func (s *Setting) ReadSection(k string, v interface{}) error {
	err := s.vp.UnmarshalKey(k, v)
	if err != nil {
		return err
	}
	if _, ok := sections[k]; !ok {
		sections[k] = v
	}
	return nil
}

func (s *Setting) ReloadAllSection() error {
	for k, v := range sections {
		err := s.ReadSection(k, v)
		if err != nil {
			return err
		}
	}

	return nil
}
